#ifndef MAINFORM_H
#define MAINFORM_H

#include <QWidget>
#include <QTimer>
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
#include <QThreadPool>
#include "commons.h"
#include "inference.h"
#include "modelloader.h"
#include "threadsafequeue.h"
#include "videocapturedetectthread.h"
#include "videofiledetectthread.h"
#include "cvmatdetectthread.h"
namespace Ui {
class MainForm;
}

class MainForm : public QWidget
{
    Q_OBJECT

public:
    explicit MainForm(QWidget *parent = nullptr);
    ~MainForm();

protected:
    void closeEvent(QCloseEvent* event) override ;// 窗口关闭事件

private:
    Ui::MainForm *ui;
    std::shared_ptr<Inference> inference;// 推理模型
    //std::unique_ptr<Inference> inference;// 推理模型
    int current_weight_index=1;
    bool run_with_cuda=false;
    QTimer *timer=nullptr;
    ThreadSafeQueue *matQueue=nullptr;
    VideoCaptureDetectThread* videoCaptureDetectThread=nullptr;
    VideoFileDetectThread* videoFileDetectThread=nullptr;
    CvmatDetectThread* cvmatDetectThread=nullptr;
    bool is_label;

    void connect_slots();				// 连接槽函数
    void refresh_model_list();				// 刷新模型列表
    void disable_all_button();				// 禁用所有按钮
    void enable_all_button();				// 启用所有按钮
    bool check_model();						// 检查模型
    void load_model_from_model_list();		// 从模型列表加载模型
    void show_img(QPixmap& pixmap);		// 显示图片
    void append_log(QString& text);		// 日志
// SLOT
private slots:
    // 读取本地文件
    void onTimeout();
    void onmodelMessage(QString err_msg);
    void onPixmapChanged(  QPixmap &mp);
    // 三个按钮
    void cammera_slot();
    void image_slot();
    void video_slot();


    // 两个spinbox
    void iou_spinbox_slot(double value);
    void conf_spinbox_slot(double value);

    // 两个 slider
    void iou_slider_slot(int value);
    void conf_slider_slot(int value);

    // 两个 reset
    void reset_iou_slot();
    void reset_conf_slot();

    // 下拉列表
    void model_select_slot(int index);

    // 导入模型按钮
    void import_model_button_slot();
    // 导入模型按钮
    void import_model_label_button_slot();
    // 加载动画
    void start_loading();
    void stop_loading(int staus,QString filepath,QString msg);

    // 是否标注图片
    void islabel_slot(bool value);
    void releaseRunning();


};

#endif // MAINFORM_H
